<?php

namespace app\home\controller;

// use think\Controller;
// 引用公共控制器
use app\common\controller\Home;

use think\Db;

//用户控制器
class User extends Home
{
    // 构造函数 全局加载一个模型
    public function __construct()
    {
        // 继承父类的构造函数 避免覆盖 已覆盖 控制器基类的方法不可用
        parent::__construct();

        // 全局用户模型
        $this->UserModel = model('User.User');

        $this->RegionModel = model('Region');
    }

    // 用户中心
    public function index()
    {

        // 查询封面图片
        $Cover = $this->LoginUser['cover'];

        // 将字符串转化为数组
        $Cover = explode(',', trim($Cover, ','));
        // var_dump($Cover);
        // exit;

        $userid = $this->LoginUser['id'];

        // 查看全部的帖子
        $postlists = model('Post.Post')->select();

        // 查询我的所有帖子 tp内置方法
        $postlist = model('Post.Post')->where(['userid' => $userid])->select();
        // var_dump($postlist);
        // exit;


        // 查询这个id我的评论帖子 tp内置方法
        $commentlist = model('Post.Comment')->where(['userid' => $userid])->select();
        // var_dump($commentlist);
        // exit;

        // 赋值给模板
        $this->view->assign([
            'cover' => $Cover,
            'postlist' => $postlist,
            'commentlist' => $commentlist,
            'postlists' => $postlists,
        ]);

        // 加载视图


        return $this->view->fetch();
    }

    // 基本设置  就是个人中心
    public function profile()
    {

        //    判断是否有表单提交
        if ($this->request->isPost()) {

            // 接受表单中的隐藏域关键词
            $action = $this->request->param('action', '');

            // 接受所有数据
            $params = $this->request->param();

            // 修改个人资料
            if ($action == 'base') {
                // 组装数据
                $UserData = [
                    'id' => $this->LoginUser['id'],
                    'email' => trim($params['email']),
                    'nickname' => trim($params['nickname']),
                    'sex' => trim($params['sex']),
                    'province' => trim($params['province']),
                    'city' => trim($params['city']),
                    'district' => trim($params['district']),
                    'content' => trim($params['content']),
                ];

                // 输入的邮箱域数据库记录的邮箱不相等 ，说明改了邮箱 改了说明需要重新认证
                if ($UserData['email'] != $this->LoginUser['email']) {
                    $UserData['auth'] = 0;
                }

                // 更新数据 使用user验证器下面的base场景规则， 返回会影响行数
                $result = $this->UserModel->validate('Common/User/User.base')->isUpdate(true)->save($UserData);

                // 更新失败
                if ($result === FALSE) {
                    $this->error($this->UserModel->getError());
                    exit;
                }

                // 查询最新的一次数据
                $user = $this->UserModel->find($this->LoginUser['id']);

                $data = [
                    'id' => $user['id'],
                    'nickname' => $user['nickname'],
                    'avatar' => is_file($user['avatar'] ? $user['avatar'] : ''),
                    'vip' => $user['vip'],
                    'auth' => $user['auth'],
                ];

                // 重新设置一些cookie
                cookie('LoginUser', $data);

                $this->success('编辑个人资料成功');
                exit;
            }

            // 修改密码
            if ($action == "password") {
                $nowpass = $this->request->param('nowpass', '', 'trim');
                $password = $this->request->param('password', '', 'trim');
                $repass = $this->request->param('repass', '', 'trim');

                if (empty($nowpass)) {
                    $this->error('当前密码不能为空');
                    exit;
                }

                if (empty($password)) {
                    $this->error('新密码不能为空');
                    exit;
                }

                if (empty($repass)) {
                    $this->error('确认密码不能为空');
                    exit;
                }

                if ($password != $repass) {
                    $this->error('新密码和确认密码不一致');
                    exit;
                }

                // 获取密码盐
                $salt = $this->LoginUser['salt'];

                // 当前密码加密
                $nowpass = md5($nowpass . $salt);

                if ($nowpass != $this->LoginUser['password']) {
                    $this->error('当前密码不正确');
                    exit;
                }

                // 重新生成一个密码盐
                $salt = randstr(5);

                // 重新加密新的密码
                $password = md5($password . $salt);

                // 组装数据
                $UserData = [
                    'id' => $this->LoginUser['id'],
                    'salt' => $salt,
                    'password' => $password
                ];

                // 更新数据 返回影响行数
                $result = $this->UserModel->validate('Common/User/User.password')->isUpdate(true)->save($UserData);


                if ($result === FALSE) {
                    $this->error($this->UserModel->GetError());
                    exit;
                } else {
                    // 删除cookie
                    cookie('LoginUser', null);
                    $this->success('新密码修改成功，请重新登录', url("home/index/login"));
                    exit;
                }
            }

            // 头像上传
            if ($action == "avatar") {

                // 组装数据
                $UserData = [
                    'id' => $this->LoginUser['id']
                ];

                // 判断是否有文件上传
                if ($_FILES['avatar']['error'] != 0 || $_FILES['avatar']['size'] <= 0) {
                    $this->error('无图片上传或者图片类型错误');
                    exit;
                }

                //调用封装的公共函数 上传图片
                $avatar = upload('avatar');

                // 判断 是否有上传图片成功
                if ($avatar) {
                    $UserData['avatar'] = '/uploads/' . $avatar;
                } else {
                    $this->error('上传图片失败');
                    exit();
                }

                // 更新数据
                $result = $this->UserModel->isUpdate(true)->save($UserData);

                if ($result === FALSE) {
                    $this->error('更新头像失败');
                    exit;
                }

                // 更新成功 删除就图片并更新cookie
                // 查询用户信息
                $user = $this->UserModel->find($this->LoginUser['id']);

                //删除旧图片  ./   == public
                // ./uploads/2022/234234.jpg 
                @is_file("." . $this->LoginUser['avatar']) && @unlink("." . $this->LoginUser['avatar']);

                //更新cookie 
                $data = [
                    'id' => $user['id'],
                    'nickname' => $user['nickname'],
                    'avatar' => is_file("." . $user['avatar']) ? $user['avatar'] : '',
                    'vip' => $user['vip'],
                    'auth' => $user['auth'],
                ];

                cookie('LoginUser', $data);

                $this->success('更新头像成功');
                exit;
            }

            // 背景封面上传
            if ($action == "cover") {
                // 组装数据
                $UserData = [
                    'id' => $this->LoginUser['id']
                ];

                // 调用封装的公共函数 上传图片
                $cover = uploads('cover');

                if (empty($cover)) {
                    $this->error('无文件上传或者上传文件失败');
                    exit;
                }

                // 查询封面图片
                $Cover = $this->LoginUser['cover'];

                // 字符串转化为数组
                $UserData['cover'] = implode(',', $cover) . ',' . $Cover;
                // var_dump($UserData['cover']);
                // exit;


                // 更新语句
                $result = $this->UserModel->isUpdate(true)->save($UserData);


                if ($result === FALSE) {
                    $this->error('更新背景封面失败');
                    exit;
                } else {
                    $this->success('更新背景封面成功');
                    exit;
                }
            }

            // 背景封面删除
            if ($action == "remove") {
                $UserData['cover'] = "";
                $result = $this->LoginUser->save($UserData);
                if ($result === FALSE) {
                    $this->error('删除背景封面失败');
                    exit;
                } else {
                    $this->success('删除背景封面成功');
                    exit;
                }
            }
        }

        // 查询封面图片
        $Cover = $this->LoginUser['cover'];
        // var_dump($Cover);
        // exit;

        // 将字符串转化为数组
        $Cover = explode(',', trim($Cover, ','));
        // var_dump($Cover);
        // exit;

        // 赋值给前台模块
        $this->view->assign('cover', $Cover);


        //城市-----------------------------------------------------------

        //先查询省份
        $ProvinceList = $this->RegionModel->where(['grade' => 1])->select();

        //取到省份中的第一个来作为默认省份
        $ProvinceCode = isset($ProvinceList[0]) ? $ProvinceList[0]['code'] : 0;

        //先判断是否有选择省份 有选择省份就覆盖 不能第一个了
        if ($this->LoginUser['province']) {
            $ProvinceCode = $this->LoginUser['province'];
        }

        //获取省份下面的城市
        $CityList = $this->RegionModel->where(['parentid' => $ProvinceCode])->select();

        //取到城市中第一个来作为默认城市
        $CityCode = isset($CityList[0]) ? $CityList[0]['code'] : 0;

        //先判断是否有选择城市 有选择城市就覆盖 不能第一个了
        if ($this->LoginUser['city']) {
            $CityCode = $this->LoginUser['city'];
        }

        //获取城市下面的区域
        $DistrictList = $this->RegionModel->where(['parentid' => $CityCode])->select();

        //将数据赋值给模板
        $this->view->assign([
            'province' => $ProvinceList,
            'city' => $CityList,
            'district' => $DistrictList,
        ]);


        return $this->view->fetch();
    }

    //获取地区的异步方法
    public function region()
    {
        //判断是否是一个ajax判断
        if ($this->request->isAjax()) {
            //接收code参数
            $code = $this->request->param('code', '');

            if (empty($code)) {
                $this->error('地区码获取为空', null, []);
                exit;
            }

            //查询地区数据
            $region = $this->RegionModel->where(['parentid' => $code])->select();

            if ($region) {
                $this->success('查询地区成功', null, $region);
                exit;
            } else {
                $this->error('查询失败', null, []);
                exit;
            }
        }
    }

    //邮件发送的异步方法
    public function send()
    {
        //判断是否是ajax请求
        if ($this->request->isAjax()) {
            //邮箱
            $email = $this->LoginUser['email'];

            //密码盐
            $salt = $this->LoginUser['salt'];

            //邮箱+密码盐
            $EmailRand = md5($email . $salt);

            $content = "<a target='_blank' href='http://www.teach.com/home/index/email?auth=$EmailRand'>点击邮件完成ASK论坛认证</a>";

            //调用公共函数库中封装邮件发送
            $result = email($email, $content);

            if ($result) {
                $this->success('邮件已发送');
                exit;
            } else {
                $this->error('邮件发送失败，请稍后重试');
                exit;
            }
        }
    }

    // 我的帖子
    public function mypost()
    {
        // 获取当前用户的id
        $userid = $this->LoginUser['id'];

        // 查询我的所有帖子 tp内置方法
        $postlist = model('Post.Post')->where(['userid' => $userid])->select();

        // 查询我发帖的数量
        $posts=count($postlist);
       
        // 赋值给模板
        $this->view->assign([
            'postlist' => $postlist,
            'posts'=> $posts
            // 'comment' => $comment,
        ]);


        // 加载视图
        return $this->view->fetch();
    }

    // 消费记录
    public function record()
    {
        $userid = $this->LoginUser['id'];

        // 查询我的消费记录
        $region = model('User.Record')->where(['userid' => $userid])->select();
        // var_dump($region);
        // exit;

        // 赋值给前台模板
        $this->view->assign([
            'region' => $region,
            // 'comment' => $comment,
        ]);

        // 加载视图
        return $this->view->fetch();
    }
}
